--- title: "7、最大比例" created: 2025-11-28 tags: - 算法 --- # 7、最大比例 ## 题目 [最大比例](https://www.lanqiao.cn/paper/3860/problem/120/) ![[image-ffcf9d08.png]] ## 思路分析 有点像数论里那道等差的 求什么最大公约数 然后就照着这个gcd的思路随便蒙了一下 排序 相邻元素一定存在一个公比 找最大的公比 然后化简 过了一个…… ```cpp #include using namespace std; const int N=110; int a[N]; int main() { int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); int maxq = -1, fm = 0, fz = 0; for(int i = 0; i + 1 < n; i++) { if(a[i] == 0) continue; int curq = a[i + 1] / a[i]; if(curq > maxq) { maxq = curq; fm = i + 1; fz = i; } } int maxgcd = __gcd(a[fm], a[fz]); if(maxgcd == 0) maxgcd = 1; cout << a[fm] / maxgcd << "/" << a[fz] / maxgcd << endl; return 0; } ``` 我草 居然真可以这样写 不过思路应该是这样 要找到最小的公比 因为整个数列是等比的 如果公比大了 就不能让所有的数满足等比性质 所以要找到一个能让所有数都满足的公比 把判断改成乘法 避免精度丢失 ![[image-03e16b9e.png]] 没必要存储maxq 只需要一直迭代能获得最大公比的分母和分子就行了 后面就和前面一样了 去求最大公因数 做一个约分 ```cpp #include using namespace std; const int N=110; long long a[N]; int main() { int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); long long fz = 0, fm = 1; for(int i = 0; i + 1 < n; i++) { if(fz * a[i + 1] < fm * a[i] && a[i] != a[i+1]) { fz = a[i]; fm = a[i + 1]; } } long long maxgcd = __gcd(fz, fm); cout << fm / maxgcd << "/" << fz / maxgcd << endl; return 0; } ``` ![[image-76520913.png]] 就……这样……过了? ![[image-9c7ea7fc.png]] 就……这样……ak了??? emmm 这道题确实是 我自己都不知道为什么就可以这样写 真就是蒙 这就是贪心吗 经验教训呢 是 考试时有时间多的话 贪心问题有想法就想办法完善一下 因为一开始的试试看的方案很多漏洞 把这些漏洞补全 考虑周到些 说不定就ac了呢 hh 另外 前面还有一道题 凑算式 也是用到了除法 对于这种除法的判断 都不能直接去做 他会自己取整 不可靠 要把除法转变成乘法进行判断 ## 代码实现 ```cpp #include using namespace std; const int N=110; long long a[N]; int main() { int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); long long fz = 0, fm = 1; for(int i = 0; i + 1 < n; i++) { if(fz * a[i + 1] < fm * a[i] && a[i] != a[i+1]) { fz = a[i]; fm = a[i + 1]; } } long long maxgcd = __gcd(fz, fm); cout << fm / maxgcd << "/" << fz / maxgcd << endl; return 0; } ``` ## 同类题型 ## 视频讲解 --- ⬅️ [[6、交换瓶子|6、交换瓶子]] 🏠 [[00-刷题理模型]] ➡️ [[第七届 c++ B组 省赛|第七届 c++ B组 省赛]]